#include <stdio.h>
#include "heads/ArrayList.h"
#include "heads/LinkList.h"
#include "heads/Stack.h"
#include "heads/Queue.h"

void testArrayList();
void testLinkList();
void testStack();
void testQueue();

int main() {
    printf("测试顺序表：\n");
    testArrayList();
    printf("\n测试链表：\n");
    testLinkList();
    printf("\n测试栈：\n");
    testStack();
    printf("\n测试队列：\n");
    testQueue();

    return 0;
}


void testArrayList() {
    // 初始化顺序表
    ArrayList list = createArrayList(2);

    // 添加元素
    addElement(&list, 10);
    addElement(&list, 20);
    addElement(&list, 30);

    // 更改索引为1的元素
    setElement(&list, 1, 25);

    // 获取并打印索引为1的元素
    printf("索引为1的元素: %d\n", getElement(&list, 1));

    // 删除索引为1的元素
    removeElement(&list, 1);

    // 打印所有元素
    for (int i = 0; i < list.size; ++i) {
        printf("第%d个元素: %d\n", i, getElement(&list, i));
    }

    // 销毁顺序表
    destroyArrayList(&list);
}

void testLinkList(){
    // 创建链表
    LinkList list = createLinkedList();

    // 向链表头部添加数据
    addToListHead(&list, 1);
    addToListHead(&list, 2);
    addToListHead(&list, 3);

    // 向链表尾部添加数据
    addToListTail(&list, 0);
    addToListTail(&list, -1);

    // 打印链表
    printf("链表中的元素: ");
    printList(&list);

    // 查找链表中的数据
    int searchData = 2;
    ListNode *foundNode = findInList(&list, searchData);
    if (foundNode != NULL) {
        printf("在链表中找到了值为%d的数据\n", searchData);
    } else {
        printf("在链表中没有找到值为%d的数据\n", searchData);
    }

    // 从链表中删除数据
    int removeData = 3;
    removeLinkList(&list, removeData);
    printf("删除%d之后的链表: ", removeData);
    printList(&list);

    // 从链表中删除尾结点数据
    removeData = -1;
    removeLinkList(&list, removeData);
    printf("删除%d之后的链表: ", removeData);
    printList(&list);

    // 销毁链表
    destroyList(&list);
    if (list.head == NULL && list.tail == NULL) {
        printf("链表删除成功\n");
    } else {
        printf("链表删除失败\n");
    }
}

void testStack(){
    // 创建一个栈
    Stack stack = createStack();

    // 压入数据
    pushStack(&stack, 10);
    pushStack(&stack, 20);
    pushStack(&stack, 30);

    // 打印栈顶元素
    printf("栈顶元素: %d\n", topStack(&stack));

    // 弹出数据
    printf("弹出数据: %d\n", popStack(&stack));
    printf("弹出数据: %d\n", popStack(&stack));

    // 再次打印栈顶元素
    printf("栈顶元素: %d\n", topStack(&stack));

    // 检查栈是否为空
    if (isStackEmpty(&stack)) {
        printf("栈空了\n");
    } else {
        printf("栈非空\n");
    }

    // 销毁栈
    destroyStack(&stack);
}

void testQueue(){
    // 创建一个队列
    Queue queue = createQueue();

    // 向队列中添加数据
    enqueue(&queue, 10);
    enqueue(&queue, 20);
    enqueue(&queue, 30);

    // 打印队列首元素
    printf("队首元素: %d\n", frontQueue(&queue));

    // 从队列中移除数据
    printf("出队: %d\n", dequeue(&queue));
    printf("出队: %d\n", dequeue(&queue));

    // 再次打印队列首元素
    printf("队首元素: %d\n", frontQueue(&queue));

    // 检查队列是否为空
    if (isQueueEmpty(&queue)) {
        printf("空队.\n");
    } else {
        printf("非空队.\n");
    }

    // 销毁队列
    destroyQueue(&queue);
}